home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 11.9 KB | 378 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UScriptMenu.cp
- // Copyright © 1986-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __USCRIPTMENU__
- #include "UScriptMenu.h"
- #endif
-
- // MacApp
-
- #ifndef __UAPPLICATION__
- #include "UApplication.h"
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include "UMacAppGlobals.h"
- #endif
-
- #ifndef __UMACAPPUTILITIES__
- #include "UMacAppUtilities.h"
- #endif
-
- #ifndef __UMENUMGR__
- #include "UMenuMgr.h"
- #endif
-
- #ifndef __UOSASCRIPT__
- #include "UOSAScript.h"
- #endif
-
- #ifndef __USCRIPTING__
- #include "UScripting.h"
- #endif
-
- // Toolbox
-
- #ifndef __LOWMEM__
- #include <LowMem.h>
- #endif
-
- //----------------------------------------------------------------------------------------
- // Global Functions:
- //----------------------------------------------------------------------------------------
- OSErr GetAppLocation(short refNum,
- short& vRefNum,
- long& dirID,
- CStr255& fileName);
- void FindFiles(OSType theType,
- OSType theCreator,
- FSSpec& inFSSpec,
- long& numToFind,
- FSSpec* theFSSpecs);
-
- //----------------------------------------------------------------------------------------
- // GetAppLocation:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- OSErr GetAppLocation(short refNum,
- short& vRefNum,
- long& dirID,
- CStr255& fileName)
- {
- FCBPBRec pb;
- OSErr error;
-
- pb.ioNamePtr = (StringPtr) & fileName;
- pb.ioVRefNum = 0;
- pb.ioRefNum = refNum;
- pb.ioFCBIndx = 0;
- error = PBGetFCBInfoSync(&pb);
- vRefNum = pb.ioFCBVRefNum;
- dirID = pb.ioFCBParID;
- return (error);
- }
-
- //----------------------------------------------------------------------------------------
- // FindFiles:
- //----------------------------------------------------------------------------------------
-
- void FindFiles(OSType theType,
- OSType theCreator,
- FSSpec& inFSSpec,
- long& numToFind,
- FSSpec* theFSSpecs)
- {
- MAVolatileInit(Handle, buffer, NULL);
- FailInfo fi;
- Try(fi)
- {
- const short kBufferSize = 16384;
- CInfoPBRec spec1, spec2;
- CSParam pb;
- short err = 0;
- short bufferSize = kBufferSize;
- Ptr bufferPtr = NULL;
- buffer = TempNewHandle(kBufferSize, &err);
- FailNIL(buffer);
- HLock(buffer);
- bufferPtr = *buffer;
- spec1.hFileInfo.ioFlFndrInfo.fdType = theType;
- spec1.hFileInfo.ioFlFndrInfo.fdCreator = theCreator;
- spec1.hFileInfo.ioNamePtr = NULL;
- spec1.hFileInfo.ioFlParID = inFSSpec.parID;
-
- spec2.hFileInfo.ioFlFndrInfo.fdType = (OSType)0xffffffff;
- spec2.hFileInfo.ioFlFndrInfo.fdCreator = (OSType)0xffffffff;
- spec2.hFileInfo.ioFlParID = inFSSpec.parID;
- spec2.hFileInfo.ioNamePtr = NULL;
- spec2.hFileInfo.ioFlFndrInfo.fdFlags = 0x0000;
- spec2.hFileInfo.ioFlFndrInfo.fdLocation.h = 0x0000;
- spec2.hFileInfo.ioFlFndrInfo.fdLocation.v = 0x0000;
- spec2.hFileInfo.ioFlFndrInfo.fdFldr = 0x0000;
-
- pb.ioCompletion = NULL;
- pb.ioNamePtr = NULL;
- pb.ioMatchPtr = (FSSpecPtr)theFSSpecs;
- pb.ioReqMatchCount = numToFind;
- pb.ioSearchBits = fsSBFlFndrInfo + fsSBFlParID;
- pb.ioSearchInfo1 = (CInfoPBPtr) & spec1;
- pb.ioSearchInfo2 = (CInfoPBPtr) & spec2;
- pb.ioSearchTime = 0;
- pb.ioOptBuffer = bufferPtr;
- pb.ioOptBufSize = bufferSize;
-
- pb.ioCatPosition.initialize = 0;
- pb.ioVRefNum = inFSSpec.vRefNum;
- err = PBCatSearchSync(&pb);
- if ((err != noErr) && (err != -39))
- FailOSErr(err);
- numToFind = pb.ioActMatchCount;
- buffer = DisposeIfHandle(buffer);
- fi.Success();
- }
- else
- {
- buffer = DisposeIfHandle(buffer);
- fi.ReSignal();
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior
- //----------------------------------------------------------------------------------------
-
- #undef Inherited
- #define Inherited TBehavior
-
- #pragma segment ConstructorRes
- MA_DEFINE_CLASS_M1(TScriptMenuBehavior, Inherited);
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::TScriptMenuBehavior:
- //----------------------------------------------------------------------------------------
-
- TScriptMenuBehavior::TScriptMenuBehavior()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior destructor
- //----------------------------------------------------------------------------------------
- #pragma segment MADestructorRes
-
- TScriptMenuBehavior::~TScriptMenuBehavior()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::IScriptMenuBehavior:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- void TScriptMenuBehavior::IScriptMenuBehavior()
- {
- IBehavior('osas');
-
- if (HasAppleScript())
- {
- CStr63 globalsScriptName;
- CStr63 sharedScriptName;
- CStr63 startupScriptName;
- CStr63 scriptFolderName;
- GetIndString(scriptFolderName, kScriptMenuStrings, kFolderName);
- GetIndString(globalsScriptName, kScriptMenuStrings, kGlobalsScript);
- GetIndString(sharedScriptName, kScriptMenuStrings, kSharedScript);
- GetIndString(startupScriptName, kScriptMenuStrings, kStartupScript);
-
- OSErr err = noErr;
- long stdScriptsFound = 0;
- ComponentInstance theCmp = COSAScript::GetDefaultComponent();
-
- InstallGlobalsScript(theCmp, scriptFolderName, globalsScriptName, stdScriptsFound);
- InstallSharedScript(theCmp, sharedScriptName, stdScriptsFound);
- ExecuteStartupScript(theCmp, startupScriptName, stdScriptsFound);
- AddScriptMenu(globalsScriptName, sharedScriptName, startupScriptName, stdScriptsFound);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::InstallGlobalsScript:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- void TScriptMenuBehavior::InstallGlobalsScript(ComponentInstance theCmp,
- const CStr63& scriptFolderName,
- const CStr63& globalsScriptName,
- long& stdScriptsFound)
- {
- COSAScript globalsScript;
- OSErr err = noErr;
-
- CStr32 delimeter = HasAUX() ? "/" : ":";
-
- // Look for a globals script
- CStr255 fileName;
- short appRef = LMGetCurApRefNum();
- FSSpec theSpec;
- FailOSErr(GetAppLocation(appRef, theSpec.vRefNum, theSpec.parID, fileName));
- fileName = delimeter + scriptFolderName + delimeter + globalsScriptName;
- err = FSMakeFSSpec(theSpec.vRefNum, theSpec.parID, fileName, &theSpec);
- fScriptFolder = theSpec;
-
- (CStr63 &)theSpec.name = globalsScriptName;
- AliasHandle theAliasHdl = NULL;
- err = NewAliasMinimal(&theSpec, &theAliasHdl);
- if (err == noErr)
- {
- CAEDesc globalsAliasDesc(typeAlias, (Handle)theAliasHdl);
- FailOSErr(globalsScript.SetScript(theCmp, globalsAliasDesc,
- kOSAModeCompileIntoContext, kOSAModeNull));
- COSAScript::SetGlobalScript(globalsScript);
- stdScriptsFound++;
- }
- theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::InstallSharedScript:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- void TScriptMenuBehavior::InstallSharedScript(ComponentInstance theCmp,
- const CStr63& sharedScriptName,
- long& stdScriptsFound)
- {
- OSErr err = noErr;
- FSSpec theSpec = fScriptFolder;
- (CStr63 &)theSpec.name = sharedScriptName;
- AliasHandle theAliasHdl = NULL;
- err = NewAliasMinimal(&theSpec, &theAliasHdl);
- if (err == noErr)
- {
- CAEDesc sharedAliasDesc(typeAlias, (Handle)theAliasHdl);
- COSAScript sharedScript;
- FailOSErr(sharedScript.SetScript(theCmp, sharedAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
- COSAScript::SetSharedScript(sharedScript);
- stdScriptsFound++;
- }
- theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::ExecuteStartupScript:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- void TScriptMenuBehavior::ExecuteStartupScript(ComponentInstance theCmp,
- const CStr63& startupScriptName,
- long& stdScriptsFound)
- {
- OSErr err = noErr;
- {
- FSSpec theSpec = fScriptFolder;
- (CStr63 &)theSpec.name = startupScriptName;
- AliasHandle theAliasHdl = NULL;
- err = NewAliasMinimal(&theSpec, &theAliasHdl);
- if (err == noErr)
- {
- CAEDesc startupAliasDesc(typeAlias, (Handle)theAliasHdl);
- COSAScript startupScript;
- FailOSErr(startupScript.SetScript(theCmp, startupAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
- COSAScript aResult;
- COSAScript globalsScript = COSAScript::GetGlobalScript();
- Boolean hasGlobals = (globalsScript != kOSANullScript);
- Boolean sharedScript = (globalsScript != kOSANullScript);
- startupScript.Execute(theCmp, globalsScript, kOSAModeNull, aResult.fScriptID);
- aResult.DisposeScript(theCmp);
- stdScriptsFound++;
- }
- theAliasHdl = (AliasHandle)DisposeIfHandle((Handle)theAliasHdl);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::AddScriptMenu:
- //----------------------------------------------------------------------------------------
- #pragma segment AOpen
-
- void TScriptMenuBehavior::AddScriptMenu(const CStr63& globalsScriptName,
- const CStr63& sharedScriptName,
- const CStr63& startupScriptName,
- long& stdScriptsFound)
- {
- OSErr err = noErr;
-
- gApplication->SetupTheMenus();
- long numScripts = 20;
- FSSpec* theSpecs = (FSSpec *)NewPtr(sizeof(FSSpec) * numScripts);
- FSSpec theSpec = fScriptFolder;
- FindFiles('osas', 'ToyS', theSpec, numScripts, theSpecs);
- if ((numScripts - stdScriptsFound) > 0)
- {
- CStr255 fileName;
- MenuRef scriptMenu = MAGetMenu(mScripts);
- MAInsertMenu(scriptMenu, mScripts, 0);
- FSSpec * aScriptSpec = theSpecs;
- short theMItem = 1;
- while (numScripts--)
- {
- fileName = (CStr63 &)aScriptSpec->name;
- if ((fileName != globalsScriptName) &&
- (fileName != sharedScriptName) &&
- (fileName != startupScriptName))
- {
- AppendMenu(scriptMenu, (ConstStr255Param)"\ptemp");
- fileName = (CStr63 &)aScriptSpec->name;
- SetMenuItemText(scriptMenu, theMItem++, fileName);
- }
- aScriptSpec++;
- }
- }
- InvalidateMenuBar();
- theSpecs = (FSSpec *)DisposeIfPtr((Ptr)theSpecs);
- }
-
- //----------------------------------------------------------------------------------------
- // TScriptMenuBehavior::DoMenuCommand:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- void TScriptMenuBehavior::DoMenuCommand(CommandNumber aCommandNumber)
- {
- CStr255 aName;
- short menu;
- short item;
- CommandToMenuItem(aCommandNumber, menu, item);
- if (menu == mScripts)
- {
- GetMenuItemText(MAGetMenu(menu), item, aName);
- FSSpec theSpec = this->fScriptFolder;
- (CStr63 &)theSpec.name = aName;
- AliasHandle theAliasHdl = NULL;
- OSErr err = noErr;
- err = NewAliasMinimal(&theSpec, &theAliasHdl);
- if (err == noErr)
- {
- ComponentInstance theCmp = COSAScript::GetDefaultComponent();
- CAEDesc scriptAliasDesc(typeAlias, (Handle)theAliasHdl);
- COSAScript theScript;
- FailOSErr(theScript.SetScript(theCmp, scriptAliasDesc, kOSAModeCompileIntoContext, kOSAModeNull));
- TExecuteScriptCommand* theCmd = new TExecuteScriptCommand;
- theCmd->IExecuteScriptCommand(cNoCommand, (TCommandHandler *)fOwner, FALSE, FALSE, fOwner, theScript, kOSANullScript, kOSAModeNull, FALSE, theCmp);
- fOwner->PostCommand(theCmd);
- MAHiliteMenu(0); // Go ahead and unhilite the menu item since this script might
- // cause a context switch and MacApp won't unhilite it until later.
- }
- }
- else
- Inherited::DoMenuCommand(aCommandNumber);
- }
-
- //----------------------------------------------------------------------------------------
- // End of UScriptMenu.cp
-
- #pragma segment Inline
-